#ifndef __THREAD_H__
#define  __THREAD_H__

#include<pthread.h>
#include<functional>

//封装线程
template<class T>
class Thread
{
public:
    Thread(std::function<void(T&)> func,T& data,std::string name)
        :_func(func)
        ,_data(data)
        ,_pthread_name(name)
    {}

    ~Thread()
    {}

    static void* thread_func(void* arg)
    {
        Thread* p=reinterpret_cast<Thread*>(arg);
        p->_func(p->_data);
        return nullptr;
    }

    void Start()
    {
        if(-1==pthread_create(&_pthread_id,NULL,thread_func,this))
        {
            perror("pthread_create");
            return;
        }
    }

    void Wait()
    {
        pthread_join(_pthread_id,NULL);
    }

    void Detach()
    {
        pthread_detach(_pthread_id);
    }

    std::string GetPthreadName()
    {
        return _pthread_name;
    }
  
private:
    pthread_t _pthread_id;//线程ID
    std::string _pthread_name;//线程名
    T& _data;//临界资源
    std::function<void(T&)> _func;//线程执行的函数
};

#endif